// 2013年版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式的约束
// 可以在许可证文件中找到的许可证。

package types

import (
	"fmt"
	"go/token"
)

// 包描述Go包。
type Package struct {
	path     string
	name     string
	scope    *Scope
	complete bool
	imports  []*Package
	fake     bool // 如果包是假的（仅限内部使用），则会自动删除范围查找错误
	cgo      bool // 此包的使用将被重写为来自_cgo_gotypes.go的声明的使用
}

// NewPackage返回给定包路径和名称的新包。
// 包不完整，不包含显式导入。
func NewPackage(path, name string) *Package {
	scope := NewScope(Universe, token.NoPos, token.NoPos, fmt.Sprintf("package %q", path))
	return &Package{path: path, name: name, scope: scope}
}

// Path返回包路径。
func (pkg *Package) Path() string { return pkg.path }

// Name返回包名。
func (pkg *Package) Name() string { return pkg.name }

// SetName设置包名。
func (pkg *Package) SetName(name string) { pkg.name = name }

// 范围返回（完整或不完整）包范围
// 保存在包级别声明的对象（类型名，
// 常量、变量和函数）。
func (pkg *Package) Scope() *Scope { return pkg.scope }

// 如果包的作用域包含（至少）所有
// 导出对象；否则它是不完整的。
func (pkg *Package) Complete() bool { return pkg.complete }

// 标记完成将包标记为完成。
func (pkg *Package) MarkComplete() { pkg.complete = true }

// Imports返回由直接导入的包的列表
// 包装；列表按源顺序排列。
// None
// 如果pkg是从导出数据加载的，则导入包括
// 提供pkg引用的包级对象。这可能更多或更多
// 少于pkg源代码直接导入的包集。
func (pkg *Package) Imports() []*Package { return pkg.imports }

// SetImports将显式导入的包列表设置为list。
// 调用者有责任确保列表元素是唯一的。
func (pkg *Package) SetImports(list []*Package) { pkg.imports = list }

func (pkg *Package) String() string {
	return fmt.Sprintf("package %s (%q)", pkg.name, pkg.path)
}
